%define qwo qword
%define dwo dword
%define by byte
%define wo word
%define int3 0cch

%macro stp 1
p eax
fstp dword [esp]
pop eax
%endmacro

%macro i3 0
db 0xcc
%endmacro

%macro p 1 
push %1 
%endmacro

%macro p0 0
push byte 0
%endmacro
 
%macro pf 1
db 68h
dd %1
%endmacro

%macro mf 1
db 66h
db 0b8h
dd %1
%endmacro


%macro cf 1
db 03dh
dd %1
%endmacro

%macro save 1-7
%ifid %1
push %1
%endif
%ifid %2
push %2
%endif
%ifid %3
push %3
%endif
%ifid %4
push %4
%endif
%ifid %5
push %5
%endif
%ifid %6
push %6
%endif
%ifid %7
push %7
%endif
%endmacro


%macro restore 1-7
%ifid %7
pop %7
%endif
%ifid %6
pop %6
%endif
%ifid %5
pop %5
%endif
%ifid %4
pop %4
%endif
%ifid %3
pop %3
%endif
%ifid %2
pop %2
%endif
%ifid %1
pop %1
%endif
%endmacro


%macro cal 1
call dword [%1]
%endmacro


%macro ca 2
	mov eax,dword [%2]
	mov eax,dword [eax]
	p dwo [%2]
	call dword [eax+%1*4]
%endmacro


%macro  invoke 1-* 
	%rep  %0-1
		%rotate -1 
		push    %1 
	%endrep
	%rotate -1 
	call dword [%1]
%endmacro

%macro  call 1-* 
	%rep  %0-1
		%rotate -1 
		push    %1 
	%endrep
	%rotate -1 
	call %1
%endmacro


%macro BSS 2 
	%1 resb %2
	SIZEOF_%1 equ ($ - %1)
%endmacro

;must be first if used
%macro LOCALS 1+
	%push mycontext
	%stacksize flat
   	%assign %$localsize 0 
	%local %1 
	enter   %$localsize,0	
%endmacro
	
;use instead of ARGS and after LOCALS
%macro  LARGS 1+  
	%arg   %1
%endmacro

;must be used alone
%macro  ARGS 1+ 
	%push mycontext
	%arg   %1
	%stacksize flat
	%assign %$localsize 0 
	enter   %$localsize,0
%endmacro


%macro RET 1
%if  %0 = 1
	mov eax,%1
%endif
	ret
%endmacro

%macro RETAL 0-1
	%if  %0 = 1
		mov eax,%1
	%endif
	leave
	ret
	%pop
%endmacro
